﻿Imports System.Net
Imports SchoolClick.Database.UDT
Imports SchoolClick.Models.ViewModels
Imports JertiFramework.Interpretes.ErrorModelState

Namespace SchoolClick.Controllers
    <JFAllowAnonymousAttribute()> _
    Public Class MatriculaController
        Inherits System.Web.Mvc.Controller

#Region "METODOS PARA LA NUEVA SOLICITUD DE MATRICULA"

        <HttpGet()> _
        Function NuevaSolicitud() As ActionResult
            Return View()
        End Function

        <HttpGet()> _
        <JFHandleExceptionMessageAttribute(Order:=1)> _
        Function _getNuevaSolicitud() As ActionResult
            Dim db As New SchoolClickDAL

            'Primero debemos de identificar si estamos en periodo de matricula o no
            If Not db.IMatricula.IsPeriodoMatricula Then
                'Como todavia no es periodo, vamos a recuperar la informacion del periodo por medio de AJAX y regresaremos
                'la vista que indica que aun no es periodo activo
                Return PartialView("_OutOfPeriodoMatricula")
            End If

            'Retornamos el formulario de nuevo ingreso
            Return PartialView()
        End Function

        <HttpGet()> _
        <JFHandleExceptionMessageAttribute(Order:=1)> _
        Function _getInfoMatricula() As ActionResult
            Dim db As New SchoolClickDAL
            Return PartialView(db.IMatricula.GetInfoFechasMatricula)
        End Function

        <HttpPost()> _
        <OutputCache(Duration:=10000)> _
        <JFHandleExceptionMessageAttribute(Order:=1)> _
        Function _getGradosDisponibles_AJAX() As JsonResult
            Dim db As New SchoolClickDAL

            'Recuperamos los grados disponibles para la matricula
            Dim list = db.IMatricula.GetGradosDisponibles.Select(Function(gd) New With {.Text = gd.TITULO,
                                                                                        .Value = gd.ID_GRADOS_DISPONIBLES,
                                                                                        .Extra = gd.GRADO_ANTERIOR}).ToArray
            Return Json(New JFComboboxToJSON(list), JsonRequestBehavior.AllowGet)
        End Function

        <HttpPost()> _
        <OutputCache(Duration:=10000)> _
        <JFHandleExceptionMessageAttribute(Order:=1)> _
        Function _getPaises_AJAX() As JsonResult
            Dim db As New SchoolClickDAL

            'Recuperamos los grados disponibles para la matricula
            Dim list = db.IMatricula.GetPaises.Select(Function(p) New With {.Text = p.PAI_NOMBRE,
                                                                            .Value = p.ID_PAIS}).ToArray
            Return Json(New JFComboboxToJSON(list), JsonRequestBehavior.AllowGet)
        End Function

        <HttpPost()> _
        <OutputCache(Duration:=10000)> _
        <JFHandleExceptionMessageAttribute(Order:=1)> _
        Function _getCentrosEscolares_AJAX() As JsonResult
            Dim db As New SchoolClickDAL

            'Recuperamos los grados disponibles para la matricula
            Dim list = db.IMatricula.GetCentrosEscolares.Select(Function(ce) New With {.Text = ce.NOMBRE_CEDUCATIVO,
                                                                                       .Value = ce.ID_CENTRO_EDUCATIVO}).ToArray
            Return Json(New JFComboboxToJSON(list), JsonRequestBehavior.AllowGet)
        End Function

        <HttpPost()> _
        <OutputCache(Duration:=10000)> _
        <JFHandleExceptionMessageAttribute(Order:=1)> _
        Function _getMunicipios_AJAX() As JsonResult
            Dim db As New SchoolClickDAL

            'Recuperamos los grados disponibles para la matricula
            Dim list = db.IMatricula.GetMunicipios.Select(Function(m) New With {.Text = m.NOMBRE_MUNICIPIO,
                                                                                .Value = m.ID_MUNICIPIO,
                                                                                .Filter = m.ID_DEPARTAMENTO}).ToArray
            Return Json(New JFComboboxToJSON(list), JsonRequestBehavior.AllowGet)
        End Function

        <HttpGet()> _
        Function _validateNIE(NIE As String) As JsonResult
            Dim db As New SchoolClickDAL
            If db.IMatricula.IsExistNIE(NIE) Then
                Return Json("El número de NIE ingresado, ya está registrado en las solicitudes de matrícula.", JsonRequestBehavior.AllowGet)
            Else
                Return Json(True, JsonRequestBehavior.AllowGet)
            End If
        End Function

        <HttpGet()> _
        <JFHandleExceptionMessageAttribute(Order:=1)> _
        Function _getViewResponsable(form As String, width As Integer, prefix As String, Optional responsable As Boolean = False, Optional parentesco As String = "") As ActionResult
            ViewBag.Titulo = String.Empty
            ViewBag.Form = form
            ViewBag.Ancho = width
            ViewBag.Prefix = prefix
            ViewBag.IsResponsable = responsable
            ViewBag.Parentesco = parentesco
            Return PartialView()
        End Function

        <HttpPost()> _
        <JFValidarModelAttribute()> _
        <JFHandleExceptionMessageAttribute(Order:=1)> _
        Function _Matricular_Alumno(jsonData As NuevaSolicitudMatriculaViewModel) As JsonResult
            Dim db As New SchoolClickDAL
            'Antes de empezar a introducir los datos a la base, tenemos que corroborar que la informacion que se ha recibido sea 
            'correcta con los responsables y demas.
            If Not jsonData.Madre.IsResponsable AndAlso Not jsonData.Padre.IsResponsable AndAlso Not jsonData.Responsable.IsResponsable Then
                Response.TrySkipIisCustomErrors = True
                Response.StatusCode = HttpStatusCode.InternalServerError
                Return Json(New With {.notify = New JFNotifySystemMessage("No ha definido quien o quienes seran los responsables del alumno. Debera seleccionar al menos uno, ya sea el padre, madre o añadiendo un nuevo responsable.",
                                                                       titulo:="Formulario Incompleto",
                                                                       icono:=JFNotifySystemIcon.Warning,
                                                                       permanente:=False)}, JsonRequestBehavior.AllowGet)
            End If
            If jsonData.Madre.IsFallecido AndAlso jsonData.Madre.IsResponsable OrElse jsonData.Padre.IsFallecido AndAlso jsonData.Padre.IsResponsable Then
                Response.TrySkipIisCustomErrors = True
                Response.StatusCode = HttpStatusCode.InternalServerError
                Return Json(New With {.notify = New JFNotifySystemMessage("Si el padre o la madre han sido marcados como FALLECIDO, no pueden ser los responsable del alumno",
                                                                       titulo:="¡Se ha detectado una alteración en los datos!")}, JsonRequestBehavior.AllowGet)
            End If
            If jsonData.Matricula.ANIO_CURSO_UG > Date.Now.Year Then        'Comprobamos que el año en que curso su ultimo grado no sea mayor al que nos encontramos
                ModelState.AddModelError("ANIO_CURSO_UG", String.Format("El año no puede ser mayor al año {0}", Date.Now.Year))
                Return Json(New With {.success = False, .modelErrors = ModelState.ToJSONErrors}, JsonRequestBehavior.AllowGet)
            End If
            If db.IMatricula.IsExistNIE(jsonData.Matricula.NIE) Then Throw New ApplicationException("El número de NIE ingresado, ya está registrado en las solicitudes de matrícula.")

            'Una vez estamos seguro que los datos son completamente válidos, procedemos a introducir los datos en la BD, y lo que haremos
            'sera preparar los datos de los responsables para poderlos enviar al procedimiento almacenado encargado de los inserts
            Dim dataResponsables As New UDT_MATRICULA_RESPONSABLES

            'PRIMERO: Evaluamos al padre, si se inserta o no, esta fallecido o es normal
            If jsonData.Padre.IsFormActivo Then
                With jsonData.Padre.Responsable     'Significa que se activo el formmulario por lo tanto verificamos si fallecio o no el padre
                    If jsonData.Padre.IsFallecido Then
                        dataResponsables.Insert(.NOMBRES, .APELLIDOS, "PA")
                    Else
                        dataResponsables.Insert(.NOMBRES, .APELLIDOS, .DUI, .TELEFONO, .PROFESION, .CORREO_ELECTRONICO,
                                                .LUGAR_TRABAJO, .DIRECCION_TRABAJO, "PA", jsonData.Padre.IsResponsable, False)
                    End If
                End With
            End If

            'SEGUNDO: Evaluamos a la madre, si se inserta o no, esta fallecida o es normal
            If jsonData.Madre.IsFormActivo Then
                With jsonData.Madre.Responsable
                    If jsonData.Madre.IsFallecido Then
                        dataResponsables.Insert(.NOMBRES, .APELLIDOS, "MA")
                    Else
                        dataResponsables.Insert(.NOMBRES, .APELLIDOS, .DUI, .TELEFONO, .PROFESION, .CORREO_ELECTRONICO,
                                                .LUGAR_TRABAJO, .DIRECCION_TRABAJO, "MA", jsonData.Madre.IsResponsable, False)
                    End If
                End With
            End If

            'TERCERO: Evaluamos al responsable adicional si se inserta o no
            If jsonData.Responsable.IsResponsable Then
                With jsonData.Responsable.Responsable
                    dataResponsables.Insert(.NOMBRES, .APELLIDOS, .DUI, .TELEFONO, .PROFESION, .CORREO_ELECTRONICO,
                                            .LUGAR_TRABAJO, .DIRECCION_TRABAJO, jsonData.Responsable.Parentesco, True, False)
                End With
            End If

            'Mandamos todos los datos consolidados al servidor

            Dim NoSolicitud = db.IMatricula.InsertNewSolicitud(jsonData.Matricula, dataResponsables)
            Return Json(New With {.success = True,
                                  .redirectURL = Url.Action("Resumen", New With {.Solicitud = NoSolicitud, .NIE = jsonData.Matricula.NIE})})
        End Function
#End Region

#Region "METODOS PARA CONFIRMACION SOLICITUD NUEVO INGRESO"
        <HttpGet()> _
        Public Function Resumen(Solicitud As Integer, NIE As String) As ActionResult
            Dim db As New SchoolClickDAL
            Dim encodeNIE As String = HttpUtility.HtmlEncode(NIE)

            'Verificamos que exista la solicitud y el NIE
            If db.IMatricula.CheckNIEandSolicitud(Solicitud, encodeNIE) Then
                ViewBag.Solicitud = Solicitud
                ViewBag.NIE = encodeNIE
                Return View()
            Else
                Return View("Error_Anony")
            End If
        End Function
#End Region

#Region "METODOS PARA LISTADO DE ALUMNOS PRE-SELECCIONADOS"
        <HttpGet()> _
        Public Function Alumnos_Preseleccionados() As ActionResult
            Dim db As New SchoolClickDAL

            'Comprobamos si esta activada la opcion para mostrar el listado de preseleccionados
            If db.IMatricula.ShowPreseleccion Then
                Return View()
            Else
                Return View("NotShowPreseleccion")
            End If
        End Function

        Public Function _getPreselect(request As JqGridRequest, Grado As String) As JsonResult
            Dim db As New SchoolClickDAL

            'Obtenemos los datos que van a ser devueltos
            Dim datos As IEnumerable(Of V_MAT_ALUMNOS_PRESELECCIONADOS) = db.IMatricula.GetPreseleccion(Grado) _
                                                                            .OrderBy(Function(p) p.NOMBRE_COMPLETO) _
                                                                            .Skip((request.PageIndex) * request.RecordsCount) _
                                                                            .Take(request.RecordsCount).ToArray()


            'Recuperamos el total de alumnos con ese grado
            Dim total = db.IMatricula.GetPreseleccion(Grado).Count

            'Preparamos la respuesta que sera enviada al jqGrid
            Dim response As New JqGridResponse With {
                .TotalPagesCount = Integer.Parse(Math.Ceiling(CDec(total) / CDec(request.RecordsCount))),
                .PageIndex = request.PageIndex,
                .TotalRecordsCount = total
            }

            'Preparamos la salida de los datos en formato del modelo del jqGrid
            response.Records.AddRange(datos.Select(Function(p) New JqGridRecord(Of jqGrid.MATRICULA_ALUMNO_PRESELECCIONADO)(p.NIE,
                                                                New jqGrid.MATRICULA_ALUMNO_PRESELECCIONADO With {
                                                                        .Alumno = p.NOMBRE_COMPLETO,
                                                                        .NIE = p.NIE
                                                                    })))
            Return New JqGridJsonResult() With {.Data = response}
        End Function
#End Region

        <HttpGet()> _
        Public Function Alumnos_Admitidos() As ActionResult
            Return View()
        End Function

        <HttpGet()> _
        <JFHandleExceptionMessageAttribute(Order:=1)> _
        Public Function _verifyAlumnosAdmitidos(year As Integer) As ActionResult
            Dim db As New SchoolClickDAL
            If db.IMatricula.ShowAlumnosAdmitidos(year) Then Return PartialView()

            System.Threading.Thread.Sleep(4000)
            Throw New ApplicationException("Todavia no ha sido implementado...")
        End Function


    End Class
End Namespace
